import { BigNumber } from "bignumber.js";
import dayjs from "dayjs";

BigNumber.config({
  FORMAT: {
    decimalSeparator: ".",
    groupSeparator: ",",
    groupSize: 3,
    secondaryGroupSize: 0,
    fractionGroupSeparator: " ",
    fractionGroupSize: 0
  },
  ROUNDING_MODE: BigNumber.ROUND_HALF_EVEN
});

/**
 *
 * @param {*} value
 * @param {*} decimal
 * @param {*} roundMode
 *  ROUND_UP	0	向上取整 16.44 => 16.5
 *  ROUND_DOWN	1	向下取整 16.44 => 16.4
 *  ROUND_CEIL	2	向正无穷取整 16.44 => 16.5; -16.44 => -16.4
 *  ROUND_FLOOR	3	向负无穷取整 16.44 => 16.4; -16.44 => -16.5
 *  ROUND_HALF_UP	4	4舍5入 16.44 => 16.4; 16.45 => 16.5
 *  ROUND_HALF_DOWN	5	5舍6入
 *  ROUND_HALF_EVEN	6	向邻近值取整，银行家舍入法 16.45 => 16.4; 16.55 => 16.6
 *  ROUND_HALF_CEIL	7	向邻近值取整，左右距离相同的话，向上 16.44 => 16.4; 16.45 => 16.5; 16.46 => 16.5
 *  ROUND_HALF_FLOOR	8	向邻近值取整，左右距离相同的话，向下 16.44 => 16.4; 16.45 => 16.4; 16.46 => 16.5
 * @returns
 **/

export const formatNumber = (value, decimal, roundMode = 4) => {
  if (isNaN(value) || value == null) {
    value = 0;
  }
  return new BigNumber(value).toFixed(decimal, roundMode);
};

/**
 * 格式化金额
 * @param {} value
 * @returns
 */
export const formatAmount = (value, decimal = 0) => {
  if (isNaN(value) || value == null) {
    return "-";
  }
  if (value) {
    const formatedValue = new BigNumber(value).toFormat(decimal);
    // 假如格式化之后变成了0，那么就不格式化了;
    // if (formatedValue == 0) {
    //   return value
    // } else {
    return formatedValue;
    // }
  }
  return value;
};

// mock test

/**
 * 将时间戳格式化成字符串
 * @param {时间戳} time
 * @param {*} formatStr
 * @returns
 */
export const formatDate = (time, type, formatStr = "YYYY-MM-DD") => {
  if (time && time != "0" && !isNaN(Number.parseInt(time))) {
    if (type && type == 'string') {
      return dayjs(time).format(formatStr);
    } else {
      return dayjs(Number(time)).format(formatStr);
    }
  }
  return "-";
};

/**
 * 将后台返回的日期格式化成标注格式
 * @param {时间戳} dateStr 20220904
 *
 */
export const parseDateFromStr = (dateStr, format = "YYYY-MM-DD") => {

  if(dateStr === undefined || dateStr.length === 0){
    return ''
  }
  return dayjs(`${dateStr}`, "YYYYMMDD").format(format);
};

export const parseDate = (dateStr, parseFormat = "YYYYMMDD") => {
  return dayjs(`${dateStr}`, parseFormat).toDate();
};


/**
 * 计算某个时间往前X个月的具体日期  返回那天的时间戳
 * 如往前X个月没有有当前天则返回前x月+1个月的1号（例如3月30往前1个月，没有2月30，则返回3月1号）
 * @param date 当前日期
 * @param months 月数
 * @returns 
 */
export function getPreviousMonthDate(date, months) {
  // 创建一个新的日期对象，以便不修改原始日期
  var newDate = new Date(date);

  // 获取原始日期的年份、月份和日
  var originalYear = newDate.getFullYear();
  var originalMonth = newDate.getMonth();
  var originalDay = newDate.getDate();

  // 计算新的日期的月份和年份
  var newMonth = originalMonth - months;
  var newYear = originalYear;

  // 调整年份和月份，以确保它们处于有效范围内
  while (newMonth < 0) {
    newMonth += 12;
    newYear--;
  }

  // 设置新的日期的年份和月份
  newDate.setFullYear(newYear);
  newDate.setMonth(newMonth);

  // 检查新的日期的天数是否超过原始日期的最大天数
  var maxDays = new Date(newYear, newMonth + 1, 0).getDate();
  if (originalDay > maxDays) {
    newDate.setDate(1); // 设置为1号
  } else {
    newDate.setDate(originalDay);
  }

  // 返回指定日期的时间戳
  return newDate.getTime();
}


/**
 * 将小数转成%
 * @param data 
 * @param fractionDigits 
 * @returns 
 */
export function changeDecimalToPercentage(data,fractionDigits) {
  let data1 = (data*100).toFixed(fractionDigits)
  return data1
}


/**
 * 防止将\n 转成了 '\ \n' 所以需要重新转回来
 * @param val  传入的字符串
 * @returns 
 */
export  const formatRule = (val) => {
    return val.replace(/\\n/g, '\n')
}


/**
 * 过滤掉 params 对象中的 null 字段
 * @param params 
 * @returns 
 */
export function filterNullFields(params) {
  const filteredParams = Object.entries(params).reduce((acc, [key, value]) => {
    if (value !== null) {
      acc[key] = value;
    }
    return acc;
  }, {});

  return filteredParams;
}


/**
 * 合并map
 * @param map1 
 * @param map2 
 * @returns 
 */
export function mergeMaps(map1, map2) {
  const mergedMap = new Map();

  // 合并map2中的所有键值对到mergedMap
  for (const [key, value] of map2) {
    if (map1.has(key) && map1.get(key) instanceof Map && value instanceof Map) {
      // 如果键在map1和map2中都存在，并且对应的值都是Map类型，则递归合并
      const mergedValue = mergeMaps(map1.get(key), value);
      mergedMap.set(key, mergedValue);
    } else {
      // 否则直接将键值对添加到mergedMap
      mergedMap.set(key, value);
    }
  }
  // 将map1中的剩余键值对添加到mergedMap
  for (const [key, value] of map1) {
    if (!mergedMap.has(key)) {
      mergedMap.set(key, value);
    }
  }
  return mergedMap;
}


/**
 * 如果值为空或者空字符串 则用默认的代替
 * @param orgText 
 * @param normalText 
 * @returns 
 */
export function getNormarlReplace(orgText,normalText,addText?){
  if(orgText !== undefined && orgText !== "undefined" && orgText !== null && orgText.length > 0){
    return orgText + (addText ?? '')
  }
  return normalText
}